Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-night-mode-disabled vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-sticky-header-enabled" lang="en" dir="ltr"><head>
<meta charset="UTF-8">
<title>Macro (computer science)</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://en.wikipedia.org/wiki/Macro_(computer_science)"> <link href="./mw/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/user.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./mw/site.styles.css">
<link rel="stylesheet" type="text/css" href="./mw/noscript.css">
<link rel="stylesheet" type="text/css" href="./footer.css">
<link rel="stylesheet" type="text/css" href="./vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Macro_computer_science rootpage-Macro_computer_science skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">
<span id="openzim-page-title" class="mw-page-title-main"><span class="mw-page-title-main">Macro (computer science)</span></span>
</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr">
<style data-mw-deduplicate="TemplateStyles:r1236090951">
/* start https://en.wikipedia.org/ */


.mw-parser-output .hatnote{font-style:italic}.mw-parser-output div.hatnote{padding-left:1.6em;margin-bottom:0.5em}.mw-parser-output .hatnote i{font-style:normal}.mw-parser-output .hatnote+link+.hatnote{margin-top:-0.5em}@media print{body.ns-0 .mw-parser-output .hatnote{display:none!important}}


/* end https://en.wikipedia.org/ */
</style><div role="note" class="hatnote navigation-not-searchable">"Macro language" redirects here. For ISO macrolanguages, see <a href="ISO_639_macrolanguage" title="ISO 639 macrolanguage">ISO 639 macrolanguage</a>.</div>

<p>In <a href="Computer_programming" title="Computer programming">computer programming</a>, a <b>macro</b> (short for "<b>macro instruction</b>"; from <a href="Greek_language" title="Greek language">Greek</a> <i> </i>μακρο<i>-</i>&nbsp;<span class="gloss-quot">'</span><span class="gloss-text">long, large</span><span class="gloss-quot">'</span><sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>) is a rule or <a href="Pattern" title="Pattern">pattern</a> that specifies how a certain input should be <a href="Map_(mathematics)" title="Map (mathematics)">mapped</a> to a replacement output. Applying a macro to an input is known as <b>macro expansion</b>.
</p><p>The input and output may be a sequence of <a href="Lexical_token" class="mw-redirect" title="Lexical token">lexical tokens</a> or <a href="Character_(computing)" title="Character (computing)">characters</a>, or a <a href="Abstract_syntax_tree" title="Abstract syntax tree">syntax tree</a>. Character macros are supported in <a href="Software_application" class="mw-redirect" title="Software application">software applications</a> to make it easy to invoke common <a href="Command_(computing)" title="Command (computing)">command</a> sequences. Token and tree macros are supported in some <a href="Programming_language" title="Programming language">programming languages</a> to enable <a href="Code_reuse" title="Code reuse">code reuse</a> or to extend the language, sometimes for <a href="Domain-specific_languages" class="mw-redirect" title="Domain-specific languages">domain-specific languages</a>.
</p><p>Macros are used to make a sequence of computing instructions available to the programmer as a single <a href="Program_statement" class="mw-redirect" title="Program statement">program statement</a>, making the programming task less tedious and less error-prone.<sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> Thus, they are called "macros" because a "big" <a href="Block_(programming)" title="Block (programming)">block of code</a> can be expanded from a "small" sequence of characters. Macros often allow positional or keyword parameters that dictate what the <a href="Conditional_assembly_language" class="mw-redirect" title="Conditional assembly language">conditional assembler</a> program generates and have been used to create entire <a href="Computer_program" title="Computer program">programs</a> or program suites according to such variables as <a href="Operating_system" title="Operating system">operating system</a>, <a href="Computing_platform" title="Computing platform">platform</a> or other factors. The term derives from "macro instruction", and such expansions were originally used in generating <a href="Assembly_language" title="Assembly language">assembly language</a> code.
</p>
<meta property="mw:PageProp/toc">
<div class="mw-heading mw-heading2"><h2 id="Keyboard_and_mouse_macros">Keyboard and mouse macros</h2></div>
<p><b>Keyboard macros</b> and <b>mouse macros</b> allow short sequences of keystrokes and mouse actions to transform into other, usually more time-consuming, sequences of keystrokes and mouse actions. In this way, frequently used or repetitive sequences of keystrokes and mouse movements can be <a href="Automate" class="mw-redirect" title="Automate">automated</a>. Separate programs for creating these macros are called <a href="Macro_recorder" title="Macro recorder">macro recorders</a>.
</p><p>During the 1980s, macro programs&nbsp;– originally <a href="SmartKey" title="SmartKey">SmartKey</a>, then SuperKey, KeyWorks, Prokey&nbsp;– were very popular, first as a means to automatically format <a href="Screenplay" title="Screenplay">screenplays</a>, then for a variety of user-input tasks. These programs were based on the <a href="Terminate-and-stay-resident" class="mw-redirect" title="Terminate-and-stay-resident">terminate-and-stay-resident</a> mode of operation and applied to all keyboard input, no matter in which context it occurred. They have to some extent fallen into obsolescence following the advent of mouse-driven user interfaces and the availability of keyboard and mouse macros in applications, such as <a href="Word_processor" title="Word processor">word processors</a> and <a href="Spreadsheet" title="Spreadsheet">spreadsheets</a>, making it possible to create application-sensitive keyboard macros.
</p><p>Keyboard macros can be used in <a href="Massively_multiplayer_online_role-playing_game" title="Massively multiplayer online role-playing game">massively multiplayer online role-playing games</a> (MMORPGs) to perform repetitive, but lucrative tasks, thus accumulating resources. As this is done without human effort, it can skew the economy of the game. For this reason, use of macros is a violation of the <a href="Terms_of_Service" class="mw-redirect" title="Terms of Service">TOS</a> or <a href="EULA" class="mw-redirect" title="EULA">EULA</a> of most MMORPGs, and their administrators spend considerable effort to suppress them.<sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="Application_macros_and_scripting">Application macros and scripting</h3></div>
<p>Keyboard and mouse macros that are created using an application's built-in macro features are sometimes called <b>application macros</b>. They are created by carrying out the sequence once and letting the application record the actions. An underlying macro programming language, most commonly a <a href="Scripting_language" title="Scripting language">scripting language</a>, with direct access to the features of the application may also exist.
</p><p>The programmers' text editor <a href="Emacs" title="Emacs">Emacs</a> (short for "editing macros") follows this idea to a conclusion. In effect, most of the editor is made of macros. Emacs was originally devised as a set of macros in the editing language <a href="Text_Editor_and_Corrector" class="mw-redirect" title="Text Editor and Corrector">TECO</a>; it was later ported to dialects of <a href="Lisp_(programming_language)" title="Lisp (programming language)">Lisp</a>.
</p><p>Another programmers' text editor, <a href="Vim_(text_editor)" title="Vim (text editor)">Vim</a> (a descendant of <a href="Vi_(text_editor)" title="Vi (text editor)">vi</a>), also has an implementation of keyboard macros. It can record into a register (macro) what a person types on the keyboard and it can be replayed or edited just like <a href="Visual_Basic_for_Applications" title="Visual Basic for Applications">VBA</a> macros for Microsoft Office. Vim also has a scripting language called <a href="Vimscript" class="mw-redirect" title="Vimscript">Vimscript</a><sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup> to create macros.
</p><p><a href="Visual_Basic_for_Applications" title="Visual Basic for Applications">Visual Basic for Applications</a> (VBA) is a programming language included in <a href="Microsoft_Office" title="Microsoft Office">Microsoft Office</a> from Office 97 through Office 2019 (although it was available in some components of Office prior to Office 97). However, its function has evolved from and replaced the macro languages that were originally included in some of these applications.
</p><p><a href="XEDIT" title="XEDIT">XEDIT</a>, running on the <a href="Conversational_Monitor_System" title="Conversational Monitor System">Conversational Monitor System</a> (CMS) component of <a href="VM_(operating_system)" title="VM (operating system)">VM</a>, supports macros written in <a href="CMS_EXEC" title="CMS EXEC">EXEC</a>, <a href="EXEC2" class="mw-redirect" title="EXEC2">EXEC2</a> and <a href="REXX" class="mw-redirect" title="REXX">REXX</a>, and some CMS commands were actually wrappers around XEDIT macros. <a href="The_Hessling_Editor" class="mw-redirect" title="The Hessling Editor">The Hessling Editor</a> (THE), a partial clone of XEDIT, supports Rexx macros using Regina and Open <a href="Object_REXX" title="Object REXX">Object REXX</a> (oorexx). Many common applications, and some on PCs, use Rexx as a scripting language.
</p>
<div class="mw-heading mw-heading4"><h4 id="Macro_virus">Macro virus</h4></div>
<div role="note" class="hatnote navigation-not-searchable">Main article: <a href="Macro_virus_(computing)" class="mw-redirect" title="Macro virus (computing)">Macro virus (computing)</a></div>
<p><a href="Visual_Basic_for_Applications" title="Visual Basic for Applications">VBA</a> has access to most <a href="Win32_API" class="mw-redirect" title="Win32 API">Microsoft Windows system calls</a> and executes when documents are opened. This makes it relatively easy to write <a href="Computer_virus" title="Computer virus">computer viruses</a> in VBA, commonly known as <a href="Macro_virus_(computing)" class="mw-redirect" title="Macro virus (computing)">macro viruses</a>. In the mid-to-late 1990s, this became one of the most common types of computer virus. However, during the late 1990s and to date, <a href="Microsoft" title="Microsoft">Microsoft</a> has been patching and updating its programs. In addition, current anti-virus programs immediately counteract such attacks.
</p>
<div class="mw-heading mw-heading2"><h2 id="Parameterized_and_parameterless_macro">Parameterized and parameterless macro</h2></div>
<p>A <b>parameterized macro</b> is a macro that is able to insert given objects into its expansion. This gives the macro some of the power of a <a href="Function_(computer_science)" class="mw-redirect" title="Function (computer science)">function</a>.
</p><p>As a simple example, in the <a href="C_(programming_language)" title="C (programming language)">C programming language</a>, this is a typical macro that is <i>not</i> a parameterized macro, i.e., a <b>parameterless macro</b>:
</p>
<pre> <b>#define</b> PI 3.14159
</pre>
<p>This causes <code>PI</code> to always be replaced with <code>3.14159</code> wherever it occurs. An example of a parameterized macro, on the other hand, is this:
</p>
<pre> <b>#define</b> pred(x) ((x)-1)
</pre>
<p>What this macro expands to depends on what <a href="Argument_(computer_science)" class="mw-redirect" title="Argument (computer science)">argument</a> <i>x</i> is passed to it. Here are some possible expansions:
</p>
<pre> pred(2) → ((2) -1)
pred(y+2) → ((y+2) -1)
pred(f(5)) → ((f(5))-1)
</pre>
<p>Parameterized macros are a useful source-level mechanism for performing <a href="Inline_expansion" title="Inline expansion">in-line expansion</a>, but in languages such as <a href="C_(programming_language)" title="C (programming language)">C</a> where they use simple textual substitution, they have a number of severe disadvantages over other mechanisms for performing in-line expansion, such as <a href="Inline_function" class="mw-redirect" title="Inline function">inline functions</a>.
</p><p>The parameterized macros used in languages such as <a href="Lisp_programming_language" class="mw-redirect" title="Lisp programming language">Lisp</a>, <a href="PL/I" title="PL/I">PL/I</a> and <a href="Scheme_(programming_language)" title="Scheme (programming language)">Scheme</a>, on the other hand, are much more powerful, able to make decisions about what code to produce based on their arguments; thus, they can effectively be used to perform <a href="Run-time_code_generation" class="mw-redirect" title="Run-time code generation">run-time code generation</a>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Text-substitution_macros">Text-substitution macros</h2></div>
<style data-mw-deduplicate="TemplateStyles:r1251242444">
/* start https://en.wikipedia.org/ */


.mw-parser-output .ambox{border:1px solid #a2a9b1;border-left:10px solid #36c;background-color:#fbfbfb;box-sizing:border-box}.mw-parser-output .ambox+link+.ambox,.mw-parser-output .ambox+link+style+.ambox,.mw-parser-output .ambox+link+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+style+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+link+.ambox{margin-top:-1px}html body.mediawiki .mw-parser-output .ambox.mbox-small-left{margin:4px 1em 4px 0;overflow:hidden;width:238px;border-collapse:collapse;font-size:88%;line-height:1.25em}.mw-parser-output .ambox-speedy{border-left:10px solid #b32424;background-color:#fee7e6}.mw-parser-output .ambox-delete{border-left:10px solid #b32424}.mw-parser-output .ambox-content{border-left:10px solid #f28500}.mw-parser-output .ambox-style{border-left:10px solid #fc3}.mw-parser-output .ambox-move{border-left:10px solid #9932cc}.mw-parser-output .ambox-protection{border-left:10px solid #a2a9b1}.mw-parser-output .ambox .mbox-text{border:none;padding:0.25em 0.5em;width:100%}.mw-parser-output .ambox .mbox-image{border:none;padding:2px 0 2px 0.5em;text-align:center}.mw-parser-output .ambox .mbox-imageright{border:none;padding:2px 0.5em 2px 0;text-align:center}.mw-parser-output .ambox .mbox-empty-cell{border:none;padding:0;width:1px}.mw-parser-output .ambox .mbox-image-div{width:52px}@media(min-width:720px){.mw-parser-output .ambox{margin:0 10%}}@media print{body.ns-0 .mw-parser-output .ambox{display:none!important}}


/* end https://en.wikipedia.org/ */
</style>
<div role="note" class="hatnote navigation-not-searchable">See also: <a href="General-purpose_macro_processor" title="General-purpose macro processor">General-purpose macro processor</a>, <a href="Assembly_language#Macros" title="Assembly language">Assembly language §&nbsp;Macros</a>, and <a href="Algorithm" title="Algorithm">Algorithm</a></div>
<p>Languages such as <a href="C_(programming_language)" title="C (programming language)">C</a> and some <a href="Assembly_language" title="Assembly language">assembly languages</a> have rudimentary macro systems, implemented as <a href="Preprocessor" title="Preprocessor">preprocessors</a> to the compiler or assembler. <a href="C_preprocessor" title="C preprocessor">C preprocessor</a> macros work by simple textual substitution at the <a href="Lexical_token" class="mw-redirect" title="Lexical token">token</a>, rather than the character level. However, the macro facilities of more sophisticated assemblers, e.g., <a href="IBM_High_Level_Assembler" class="mw-redirect" title="IBM High Level Assembler">IBM High Level Assembler</a> (HLASM) can't be implemented with a preprocessor; the code for assembling instructions and data is interspersed with the code for assembling macro invocations.
</p><p>A classic use of macros is in the computer typesetting system <a href="TeX" title="TeX">TeX</a> and its derivatives, where most functionality is based on macros.<sup id="cite_ref-6" class="reference"><a href="#cite_note-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup>
</p><p><a href="MacroML" title="MacroML">MacroML</a> is an experimental system that seeks to reconcile <a href="Static_typing" class="mw-redirect" title="Static typing">static typing</a> and macro systems. <a href="Nemerle" title="Nemerle">Nemerle</a> has typed syntax macros, and one productive way to think of these syntax macros is as a <a href="Metaprogramming" title="Metaprogramming">multi-stage computation</a>.
</p><p>Other examples:
</p>
<ul><li><a href="M4_(computer_language)" title="M4 (computer language)">m4</a> is a sophisticated stand-alone macro processor.</li>
<li><a href="TRAC_programming_language" class="mw-redirect" title="TRAC programming language">TRAC</a></li>
<li><a href="METAL" class="mw-redirect" title="METAL">Macro Extension TAL</a>, accompanying <a href="Template_Attribute_Language" title="Template Attribute Language">Template Attribute Language</a></li>
<li>SMX: for web pages</li>
<li><a href="ML/I" title="ML/I">ML/1</a> (Macro Language One)</li>
<li><a href="Troff" title="Troff">troff</a> and <a href="Nroff" title="Nroff">nroff</a>: for typesetting and formatting Unix manpages.</li>
<li><a href="CMS_EXEC" title="CMS EXEC">CMS EXEC</a>: for command-line macros and application macros</li>
<li><a href="EXEC_2" title="EXEC 2">EXEC 2</a> in <a href="Conversational_Monitor_System" title="Conversational Monitor System">Conversational Monitor System</a> (CMS): for command-line macros and application macros</li>
<li><a href="CLIST" title="CLIST">CLIST</a> in IBM's <a href="Time_Sharing_Option" title="Time Sharing Option">Time Sharing Option</a> (TSO): for command-line macros and application macros</li>
<li><a href="REXX" class="mw-redirect" title="REXX">REXX</a>: for command-line macros and application macros in, e.g., <a href="AmigaOS" title="AmigaOS">AmigaOS</a>, CMS, <a href="OS/2" title="OS/2">OS/2</a>, TSO</li>
<li><a href="SCRIPT_(markup)#SCRIPT_macros" title="SCRIPT (markup)">SCRIPT</a>: for formatting documents</li>
<li>Various <a href="Shell_(computing)#Text_(CLI)_shells" title="Shell (computing)">shells</a> for, e.g., <a href="Linux" title="Linux">Linux</a></li></ul>
<p>Some major applications have been written as text macro invoked by other applications, e.g., by <a href="XEDIT" title="XEDIT">XEDIT</a> in CMS.
</p>
<div class="mw-heading mw-heading3"><h3 id="Embeddable_languages">Embeddable languages</h3></div>
<p>Some languages, such as <a href="PHP" title="PHP">PHP</a>, can be embedded in free-format text, or the source code of other languages. The mechanism by which the code fragments are recognised (for instance, being bracketed by <code>&lt;?php</code> and <code>?&gt;</code>) is similar to a textual macro language, but they are much more powerful, fully featured languages.
</p>
<div class="mw-heading mw-heading2"><h2 id="Procedural_macros">Procedural macros</h2></div>

<p>Macros in the <a href="PL/I" title="PL/I">PL/I</a> language are written in a subset of PL/I itself: the compiler executes "<a href="Preprocessor" title="Preprocessor">preprocessor</a> statements" at compilation time, and the output of this execution forms part of the code that is compiled. The ability to use a familiar <a href="Procedural_language" class="mw-redirect" title="Procedural language">procedural language</a> as the macro language gives power much greater than that of text substitution macros, at the expense of a larger and slower compiler. Macros in PL/I, as well as in many assemblers, may have <a href="Side_effect_(computer_science)" title="Side effect (computer science)">side effects</a>, e.g., setting variables that other macros can access.
</p><p><a href="Frame_technology_(software_engineering)" title="Frame technology (software engineering)">Frame technology</a>'s frame macros have their own command syntax but can also contain text in any language. Each frame is both a generic component in a hierarchy of nested subassemblies, and a procedure for integrating itself with its subassembly frames (a recursive process that resolves integration conflicts in favor of higher level subassemblies). The outputs are custom documents, typically compilable source modules. Frame technology can avoid the proliferation of similar but subtly different components, an issue that has plagued software development since the invention of macros and <a href="Subroutine" class="mw-redirect" title="Subroutine">subroutines</a>.
</p><p>Most assembly languages have less powerful procedural macro facilities, for example allowing a block of code to be repeated N times for <a href="Loop_unwinding" class="mw-redirect" title="Loop unwinding">loop unrolling</a>; but these have a completely different syntax from the actual assembly language.
</p>
<div class="mw-heading mw-heading2"><h2 id="Syntactic_macros">Syntactic macros</h2></div>
<p>Macro systems—such as the C preprocessor described earlier—that work at the level of lexical tokens cannot preserve the lexical structure reliably.
Syntactic macro systems work instead at the level of <a href="Abstract_syntax_tree" title="Abstract syntax tree">abstract syntax trees</a>, and preserve the lexical structure of the original program. The most widely used implementations of syntactic macro systems are found in <a href="Lisp_(programming_language)" title="Lisp (programming language)">Lisp</a>-like languages. These languages are especially suited for this style of macro due to their uniform, parenthesized syntax (known as <a href="S-expression" title="S-expression">S-expressions</a>). In particular, uniform syntax makes it easier to determine the invocations of macros. Lisp macros transform the program structure itself, with the full language available to express such transformations. While syntactic macros are often found in Lisp-like languages, they are also available in other languages such as <a href="Prolog" title="Prolog">Prolog</a>,<sup id="cite_ref-7" class="reference"><a href="#cite_note-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup> <a href="Erlang_(programming_language)" title="Erlang (programming language)">Erlang</a>,<sup id="cite_ref-8" class="reference"><a href="#cite_note-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup> <a href="Dylan_(programming_language)" title="Dylan (programming language)">Dylan</a>,<sup id="cite_ref-9" class="reference"><a href="#cite_note-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup> <a href="Scala_(programming_language)" title="Scala (programming language)">Scala</a>,<sup id="cite_ref-10" class="reference"><a href="#cite_note-10"><span class="cite-bracket">[</span>10<span class="cite-bracket">]</span></a></sup> <a href="Nemerle" title="Nemerle">Nemerle</a>,<sup id="cite_ref-11" class="reference"><a href="#cite_note-11"><span class="cite-bracket">[</span>11<span class="cite-bracket">]</span></a></sup> <a href="Rust_(programming_language)" title="Rust (programming language)">Rust</a>,<sup id="cite_ref-12" class="reference"><a href="#cite_note-12"><span class="cite-bracket">[</span>12<span class="cite-bracket">]</span></a></sup> <a href="Elixir_(programming_language)" title="Elixir (programming language)">Elixir</a>,<sup id="cite_ref-13" class="reference"><a href="#cite_note-13"><span class="cite-bracket">[</span>13<span class="cite-bracket">]</span></a></sup> <a href="Nim_(programming_language)" title="Nim (programming language)">Nim</a>,<sup id="cite_ref-14" class="reference"><a href="#cite_note-14"><span class="cite-bracket">[</span>14<span class="cite-bracket">]</span></a></sup> <a href="Haxe" title="Haxe">Haxe</a>,<sup id="cite_ref-15" class="reference"><a href="#cite_note-15"><span class="cite-bracket">[</span>15<span class="cite-bracket">]</span></a></sup> and <a href="Julia_(programming_language)" title="Julia (programming language)">Julia</a>.<sup id="cite_ref-16" class="reference"><a href="#cite_note-16"><span class="cite-bracket">[</span>16<span class="cite-bracket">]</span></a></sup> They are also available as third-party extensions to <a href="JavaScript" title="JavaScript">JavaScript</a><sup id="cite_ref-17" class="reference"><a href="#cite_note-17"><span class="cite-bracket">[</span>17<span class="cite-bracket">]</span></a></sup> and <a href="C_Sharp_(programming_language)" title="C Sharp (programming language)">C#</a>.<sup id="cite_ref-18" class="reference"><a href="#cite_note-18"><span class="cite-bracket">[</span>18<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="Early_Lisp_macros">Early Lisp macros</h3></div>
<p>Before Lisp had macros, it had so-called <a href="Fexpr" title="Fexpr">FEXPRs</a>, function-like operators whose inputs were not the values computed by the arguments but rather the syntactic forms of the arguments, and whose output were values to be used in the computation. In other words, FEXPRs were implemented at the same level as EVAL, and provided a window into the meta-evaluation layer. This was generally found to be a difficult model to reason about effectively.<sup id="cite_ref-19" class="reference"><a href="#cite_note-19"><span class="cite-bracket">[</span>19<span class="cite-bracket">]</span></a></sup>
</p><p>In 1963, Timothy Hart proposed adding macros to Lisp 1.5 in <a href="AI_Memo" title="AI Memo">AI Memo</a> 57: MACRO Definitions for LISP.<sup id="cite_ref-20" class="reference"><a href="#cite_note-20"><span class="cite-bracket">[</span>20<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="Anaphoric_macros">Anaphoric macros</h3></div>
<div role="note" class="hatnote navigation-not-searchable">Main article: <a href="Anaphoric_macro" title="Anaphoric macro">Anaphoric macro</a></div>
<p>An anaphoric macro is a type of programming macro that deliberately captures some form supplied to the macro which may be referred to by an anaphor (an expression referring to another). Anaphoric macros first appeared in Paul Graham's On Lisp and their name is a reference to linguistic anaphora—the use of words as a substitute for preceding words.
</p>
<div class="mw-heading mw-heading3"><h3 id="Hygienic_macros">Hygienic macros</h3></div>
<div role="note" class="hatnote navigation-not-searchable">Main article: <a href="Hygienic_macro" title="Hygienic macro">Hygienic macro</a></div>
<p>In the mid-eighties, a number of papers<sup id="cite_ref-21" class="reference"><a href="#cite_note-21"><span class="cite-bracket">[</span>21<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-22" class="reference"><a href="#cite_note-22"><span class="cite-bracket">[</span>22<span class="cite-bracket">]</span></a></sup> introduced the notion of <a href="Hygienic_macro" title="Hygienic macro">hygienic macro</a> expansion (<code>syntax-rules</code>), a pattern-based system where the syntactic environments of the macro definition and the macro use are distinct, allowing macro definers and users not to worry about inadvertent variable capture (cf. <a href="Referential_transparency" title="Referential transparency">referential transparency</a>). Hygienic macros have been standardized for Scheme in the <a href="R5RS" class="mw-redirect" title="R5RS">R5RS</a>, <a href="R6RS" class="mw-redirect" title="R6RS">R6RS</a>, and <a href="R7RS" class="mw-redirect" title="R7RS">R7RS</a> standards. A number of competing implementations of hygienic macros exist such as <code>syntax-rules</code>, <code>syntax-case</code>, explicit renaming, and syntactic closures. Both <code>syntax-rules</code> and <code>syntax-case</code> have been standardized in the Scheme standards.
</p><p>Recently, <a href="Racket_(programming_language)" title="Racket (programming language)">Racket</a> has combined the notions of hygienic macros with a "tower of evaluators", so that the syntactic expansion time of one macro system is the ordinary runtime of another block of code,<sup id="cite_ref-23" class="reference"><a href="#cite_note-23"><span class="cite-bracket">[</span>23<span class="cite-bracket">]</span></a></sup> and showed how to apply interleaved expansion and parsing in a non-parenthesized language.<sup id="cite_ref-24" class="reference"><a href="#cite_note-24"><span class="cite-bracket">[</span>24<span class="cite-bracket">]</span></a></sup>
</p><p>A number of languages other than Scheme either implement hygienic macros or implement partially hygienic systems. Examples include <a href="Scala_(programming_language)" title="Scala (programming language)">Scala</a>, <a href="Rust_(programming_language)" title="Rust (programming language)">Rust</a>, <a href="Elixir_(programming_language)" title="Elixir (programming language)">Elixir</a>, <a href="Julia_(programming_language)" title="Julia (programming language)">Julia</a>, <a href="Dylan_(programming_language)" title="Dylan (programming language)">Dylan</a>, <a href="Nim_(programming_language)" title="Nim (programming language)">Nim</a>, and <a href="Nemerle" title="Nemerle">Nemerle</a>.
</p>
<div class="mw-heading mw-heading3"><h3 id="Applications">Applications</h3></div>
<dl><dt>Evaluation order</dt>
<dd>Macro systems have a range of uses. Being able to choose the order of evaluation (see <a href="Lazy_evaluation" title="Lazy evaluation">lazy evaluation</a> and <a href="Strict_function" title="Strict function">non-strict functions</a>) enables the creation of new syntactic constructs (e.g. <a href="Control_structures" class="mw-redirect" title="Control structures">control structures</a>) indistinguishable from those built into the language. For instance, in a Lisp dialect that has <code>cond</code> but lacks <code>if</code>, it is possible to define the latter in terms of the former using macros. For example, Scheme has both <a href="Continuation" title="Continuation">continuations</a> and hygienic macros, which enables a programmer to design their own control abstractions, such as looping and early exit constructs, without the need to build them into the language.</dd>
<dt>Data sub-languages and domain-specific languages</dt>
<dd>Next, macros make it possible to define data languages that are immediately compiled into code, which means that constructs such as <a href="State_machine" class="mw-redirect" title="State machine">state machines</a> can be implemented in a way that is both natural and efficient.<sup id="cite_ref-25" class="reference"><a href="#cite_note-25"><span class="cite-bracket">[</span>25<span class="cite-bracket">]</span></a></sup></dd>
<dt>Binding constructs</dt>
<dd>Macros can also be used to introduce new binding constructs. The most well-known example is the transformation of <code>let</code> into the application of a function to a set of arguments.</dd></dl>
<p><a href="Matthias_Felleisen" title="Matthias Felleisen">Felleisen</a> conjectures<sup id="cite_ref-three-uses_26-0" class="reference"><a href="#cite_note-three-uses-26"><span class="cite-bracket">[</span>26<span class="cite-bracket">]</span></a></sup> that these three categories make up the primary legitimate uses of macros in such a system. Others have proposed alternative uses of macros, such as <a href="Anaphoric_macro" title="Anaphoric macro">anaphoric macros</a> in macro systems that are unhygienic or allow selective unhygienic transformation.
</p><p>The interaction of macros and other language features has been a productive area of research. For example, <a href="Software_component" title="Software component">components</a> and <a href="Modular_programming" title="Modular programming">modules</a> are useful for large-scale programming, but the interaction of macros and these other constructs must be defined for their use together. Module and component-systems that can interact with macros have been proposed for Scheme and other languages with macros. For example, the <a href="Racket_(programming_language)" title="Racket (programming language)">Racket</a> language extends the notion of a macro system to a syntactic tower, where macros can be written in languages including macros, using hygiene to ensure that syntactic layers are distinct and allowing modules to export macros to other modules.
</p>
<div class="mw-heading mw-heading2"><h2 id="Macros_for_machine-independent_software">Macros for machine-independent software</h2></div>
<p>Macros are normally used to map a short string (macro invocation) to a longer sequence of instructions. Another, less common, use of macros is to do the reverse: to map a sequence of instructions to a macro string. This was the approach taken by the <a href="STAGE2" class="mw-redirect" title="STAGE2">STAGE2 Mobile Programming System</a>, which used a rudimentary macro compiler (called SIMCMP) to map the specific instruction set of a given computer into <i>machine-independent</i> macros. Applications (notably compilers) written in these machine-independent macros can then be run without change on any computer equipped with the rudimentary macro compiler. The first application run in such a context is a more sophisticated and powerful macro compiler, written in the machine-independent macro language. This macro compiler is applied to itself, in a <a href="Bootstrapping_(computing)" class="mw-redirect" title="Bootstrapping (computing)">bootstrap</a> fashion, to produce a compiled and much more efficient version of itself. The advantage of this approach is that complex applications can be ported from one computer to a very different computer with very little effort (for each target machine architecture, just the writing of the rudimentary macro compiler).<sup id="cite_ref-27" class="reference"><a href="#cite_note-27"><span class="cite-bracket">[</span>27<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-28" class="reference"><a href="#cite_note-28"><span class="cite-bracket">[</span>28<span class="cite-bracket">]</span></a></sup> The advent of modern programming languages, notably <a href="C_(programming_language)" title="C (programming language)">C</a>, for which compilers are available on virtually all computers, has rendered such an approach superfluous. This was, however, one of the first instances (if not the first) of <a href="Bootstrapping_(compilers)" title="Bootstrapping (compilers)">compiler bootstrapping</a>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Assembly_language">Assembly language</h2></div>
<p>While <i>macro instructions</i> can be defined by a programmer for any set of native assembler program instructions, typically macros are associated with macro libraries delivered with the operating system allowing access to operating system functions such as
</p>
<ul><li>peripheral access by <a href="Access_methods" class="mw-redirect" title="Access methods">access methods</a> (including macros such as OPEN, CLOSE, READ and WRITE)</li>
<li>operating system functions such as ATTACH, WAIT and POST for subtask creation and synchronization.<sup id="cite_ref-29" class="reference"><a href="#cite_note-29"><span class="cite-bracket">[</span>29<span class="cite-bracket">]</span></a></sup> Typically such macros expand into executable code, e.g., for the EXIT macroinstruction,</li>
<li>a list of <i>define constant</i> instructions, e.g., for the <a href="Data_Control_Block" title="Data Control Block">DCB</a> macro—DTF (Define The File) for <a href="DOS/360_and_successors" title="DOS/360 and successors">DOS</a><sup id="cite_ref-30" class="reference"><a href="#cite_note-30"><span class="cite-bracket">[</span>30<span class="cite-bracket">]</span></a></sup>—or a combination of code and constants, with the details of the expansion depending on the parameters of the macro instruction (such as a reference to a file and a data area for a READ instruction);</li>
<li>the executable code often terminated in either a <i>branch and link register</i> instruction to call a routine, or a <a href="Supervisor_call" class="mw-redirect" title="Supervisor call">supervisor call</a> instruction to call an operating system function directly.</li>
<li>Generating a <i>Stage 2</i> job stream for <a href="System_Generation_(OS)" title="System Generation (OS)">system generation</a> in, e.g., <a href="OS/360" class="mw-redirect" title="OS/360">OS/360</a>. Unlike typical macros, sysgen stage 1 macros do not generate data or code to be loaded into storage, but rather use the <b>PUNCH</b> statement to output <a href="Job_Control_Language" title="Job Control Language">JCL</a> and associated data.</li></ul>
<p>In older operating systems such as those used on IBM mainframes, full operating system functionality was only available to assembler language programs, not to high level language programs (unless assembly language subroutines were used, of course), as the standard macro instructions did not always have counterparts in routines available to high-level languages.
</p>
<div class="mw-heading mw-heading2"><h2 id="History">History</h2></div>
<p>In the mid-1950s, when <a href="Assembly_language" title="Assembly language">assembly language</a> programming was the main way to program a <a href="Computer" title="Computer">computer</a>, <b>macro instruction</b> <a href="Software_feature" title="Software feature">features</a> were developed to reduce source code (by generating multiple assembly statements from each macro instruction) and to enforce coding conventions (e.g. specifying input/output commands in standard ways).<sup id="cite_ref-31" class="reference"><a href="#cite_note-31"><span class="cite-bracket">[</span>31<span class="cite-bracket">]</span></a></sup> A macro instruction embedded in the otherwise assembly source code would be processed by a macro compiler, a <a href="Preprocessor" title="Preprocessor">preprocessor</a> to the assembler, to replace the macro with one or more assembly instructions. The resulting code, pure assembly, would be translated to <a href="Machine_language" class="mw-redirect" title="Machine language">machine code</a> by the assembler.<sup id="cite_ref-cisco_32-0" class="reference"><a href="#cite_note-cisco-32"><span class="cite-bracket">[</span>32<span class="cite-bracket">]</span></a></sup>
</p><p>Two of the earliest programming installations to develop macro languages for the IBM 705 computer were at Dow Chemical Corp. in Delaware and the Air Material Command, Ballistics Missile Logistics Office in California.
</p><p>Some consider macro instructions as an intermediate step between assembly language programming and the <a href="High-level_programming_languages" class="mw-redirect" title="High-level programming languages">high-level programming languages</a> that followed, such as <a href="FORTRAN" class="mw-redirect" title="FORTRAN">FORTRAN</a> and <a href="COBOL" title="COBOL">COBOL</a>.
</p><p>By the late 1950s the macro language was followed by the <a href="Macro_Assembler" class="mw-redirect" title="Macro Assembler">Macro Assemblers</a>. This was a combination of both where one program served both functions, that of a macro pre-processor and an assembler in the same package.<sup id="cite_ref-cisco_32-1" class="reference"><a href="#cite_note-cisco-32"><span class="cite-bracket">[</span>32<span class="cite-bracket">]</span></a></sup> Early examples are <a href="IBM_700/7000_series#FORTRAN_assembly_program" title="IBM 700/7000 series">FORTRAN Assembly Program</a> (FAP)<sup id="cite_ref-33" class="reference"><a href="#cite_note-33"><span class="cite-bracket">[</span>33<span class="cite-bracket">]</span></a></sup> and Macro Assembly Program (IBMAP)<sup id="cite_ref-34" class="reference"><a href="#cite_note-34"><span class="cite-bracket">[</span>34<span class="cite-bracket">]</span></a></sup> on the <a href="IBM_709" title="IBM 709">IBM 709</a>, <a href="IBM_7094" class="mw-redirect" title="IBM 7094">7094</a>, <a href="IBM_7040" title="IBM 7040">7040</a> and 7044, and <a href="Autocoder" title="Autocoder">Autocoder</a><sup id="cite_ref-35" class="reference"><a href="#cite_note-35"><span class="cite-bracket">[</span>35<span class="cite-bracket">]</span></a></sup> on the <a href="IBM_7070" title="IBM 7070">7070/7072/7074</a>.
</p><p>In 1959, Douglas E. Eastwood and <a href="Douglas_McIlroy" title="Douglas McIlroy">Douglas McIlroy</a> of <a href="Bell_Labs" title="Bell Labs">Bell Labs</a> introduced conditional and recursive macros into the popular <a href="Symbolic_Assembly_Program" title="Symbolic Assembly Program">SAP</a> assembler,<sup id="cite_ref-CSTR99_36-0" class="reference"><a href="#cite_note-CSTR99-36"><span class="cite-bracket">[</span>36<span class="cite-bracket">]</span></a></sup> creating what is known as Macro SAP.<sup id="cite_ref-MSAP_37-0" class="reference"><a href="#cite_note-MSAP-37"><span class="cite-bracket">[</span>37<span class="cite-bracket">]</span></a></sup> McIlroy's 1960 paper was seminal in the area of extending any (including <a href="High-level_programming_language" title="High-level programming language">high-level</a>) programming languages through <a href="General-purpose_macro_processor" title="General-purpose macro processor">macro processors</a>.<sup id="cite_ref-Lay85_38-0" class="reference"><a href="#cite_note-Lay85-38"><span class="cite-bracket">[</span>38<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-CSTR99_36-1" class="reference"><a href="#cite_note-CSTR99-36"><span class="cite-bracket">[</span>36<span class="cite-bracket">]</span></a></sup>
</p><p>Macro Assemblers allowed assembly language programmers to implement their own macro-language and allowed limited portability of code between two machines running the same CPU but different operating systems, for example, early versions of <a href="MS-DOS" title="MS-DOS">MS-DOS</a> and <a href="CP/M-86" title="CP/M-86">CP/M-86</a>. The macro library would need to be written for each target machine but not the overall assembly language program. Note that more powerful macro assemblers allowed use of conditional assembly constructs in macro instructions that could generate different code on different machines or different operating systems, reducing the need for multiple libraries.
</p><p>In the 1980s and early 1990s, desktop PCs were only running at a few MHz and assembly language routines were commonly used to speed up programs written in C, Fortran, Pascal and others. These languages, at the time, used different calling conventions. Macros could be used to interface routines written in assembly language to the front end of applications written in almost any language. Again, the basic assembly language code remained the same, only the macro libraries needed to be written for each target language.
</p><p>In modern operating systems such as Unix and its derivatives, operating system access is provided through subroutines, usually provided by dynamic libraries. High-level languages such as C offer comprehensive access to operating system functions, obviating the need for assembler language programs for such functionality.
</p><p>Moreover, <a href="Standard_library" title="Standard library">standard libraries</a> of several newer programming languages, such as <a href="Go_(programming_language)" title="Go (programming language)">Go</a>, actively discourage the use of <a href="System_call" title="System call">syscalls</a> in favor of <a href="Cross-platform_software" title="Cross-platform software">platform-agnostic</a> libraries as well if not necessary, to improve <a href="Portability_(software)" class="mw-redirect" title="Portability (software)">portability</a> and security.<sup id="cite_ref-39" class="reference"><a href="#cite_note-39"><span class="cite-bracket">[</span>39<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="See_also">See also</h2></div>
<ul><li><a href="Anaphoric_macro" title="Anaphoric macro">Anaphoric macro</a></li>
<li><a href="Assembly_language#Macros" title="Assembly language">Assembly language §&nbsp;Macros</a> – Backstory of macros</li>
<li><a href="Compound_operator" class="mw-redirect" title="Compound operator">Compound operator</a>&nbsp;– Basic programming language construct<span style="display:none" class="category-annotation-with-redirected-description">Pages displaying short descriptions of redirect targets</span></li>
<li><a href="Extensible_programming" title="Extensible programming">Extensible programming</a>&nbsp;– Style of computer programming</li>
<li><a href="Fused_operation" class="mw-redirect" title="Fused operation">Fused operation</a>&nbsp;– Basic programming language construct<span style="display:none" class="category-annotation-with-redirected-description">Pages displaying short descriptions of redirect targets</span></li>
<li><a href="Hygienic_macro" title="Hygienic macro">Hygienic macro</a>&nbsp;– Macros whose expansion is guaranteed not to cause the capture of identifiers</li>
<li><a href="Macro_and_security" class="mw-redirect" title="Macro and security">Macro and security</a>&nbsp;– Rule for substituting a set input with a set output<span style="display:none" class="category-annotation-with-redirected-description">Pages displaying short descriptions of redirect targets</span></li>
<li><a href="Programming_by_demonstration" title="Programming by demonstration">Programming by demonstration</a>&nbsp;– Technique for teaching a computer or a robot new behaviors</li>
<li><a href="String_interpolation" title="String interpolation">String interpolation</a>&nbsp;– Replacing placeholders in a string with values</li></ul>
<div class="mw-heading mw-heading2"><h2 id="References">References</h2></div>
<style data-mw-deduplicate="TemplateStyles:r1239543626">
/* start https://en.wikipedia.org/ */


.mw-parser-output .reflist{margin-bottom:0.5em;list-style-type:decimal}@media screen{.mw-parser-output .reflist{font-size:90%}}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}


/* end https://en.wikipedia.org/ */
</style><div class="reflist">
<div class="mw-references-wrap mw-references-columns"><ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><b><a href="#cite_ref-1">^</a></b></span> <span class="reference-text"><i><a href="Oxford_English_Dictionary" title="Oxford English Dictionary">Oxford English Dictionary</a></i>, <i>s.v.</i> <a rel="nofollow" class="external text" href="https://www.oed.com/view/Entry/111926">macro</a>, <a rel="nofollow" class="external text" href="https://www.oed.com/view/Entry/233194">macro-instruction</a>, and <a rel="nofollow" class="external text" href="https://www.oed.com/view/Entry/111927">macro-</a></span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-2">^</a></b></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r1238218222">
/* start https://en.wikipedia.org/ */


.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("./mw/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("./mw/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("./mw/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("./mw/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}


/* end https://en.wikipedia.org/ */
</style><cite id="CITEREFGreenwaldKane1959" class="citation journal cs1">Greenwald, Irwin D.; Kane, Maureen (April 1959). <a rel="nofollow" class="external text" href="https://doi.org/10.1145%2F320964.320967">"The Share 709 System: Programming and Modification"</a>. <i>Journal of the ACM</i>. <b>6</b> (2). New York, NY, USA: ACM: <span class="nowrap">128–</span>133. <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<span class="id-lock-free" title="Freely accessible"><a rel="nofollow" class="external text" href="https://doi.org/10.1145%2F320964.320967">10.1145/320964.320967</a></span>. <a href="S2CID_(identifier)" class="mw-redirect" title="S2CID (identifier)">S2CID</a>&nbsp;<a rel="nofollow" class="external text" href="https://api.semanticscholar.org/CorpusID:27424222">27424222</a>. <q>One of the important uses of programmer macros is to save time and clerical-type errors in writing sequence of instructions which are often repeated in the course of a program.</q></cite></span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-3">^</a></b></span> <span class="reference-text"><cite id="CITEREFStrachey1965" class="citation journal cs1"><a href="Christopher_Strachey" title="Christopher Strachey">Strachey, Christopher</a> (October 1965). <a rel="nofollow" class="external text" href="https://doi.org/10.1093%2Fcomjnl%2F8.3.225">"A General Purpose Macrogenerator"</a>. <i>Computer Journal</i>. <b>8</b> (3): <span class="nowrap">225–</span>241. <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<span class="id-lock-free" title="Freely accessible"><a rel="nofollow" class="external text" href="https://doi.org/10.1093%2Fcomjnl%2F8.3.225">10.1093/comjnl/8.3.225</a></span>.</cite></span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><b><a href="#cite_ref-4">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://www.runescape.com/">"Runescape: The Massive Online Adventure Game by Jagex Ltd"</a><span class="reference-accessdate">. Retrieved <span class="nowrap">2008-04-03</span></span>.</cite></span>
</li>
<li id="cite_note-5"><span class="mw-cite-backlink"><b><a href="#cite_ref-5">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://www.vim.org/scripts/index.php">"scripts: vim online"</a>. <i>www.vim.org</i>.</cite></span>
</li>
<li id="cite_note-6"><span class="mw-cite-backlink"><b><a href="#cite_ref-6">^</a></b></span> <span class="reference-text"><cite id="CITEREFFine" class="citation web cs1">Fine, Johnathan. <a rel="nofollow" class="external text" href="http://svn.tug.org/TUGboat/tb27-0/fine.pdf">"T E X forever!"</a> <span class="cs1-format">(PDF)</span>. <i>Tex Users Group</i>. p.&nbsp;141<span class="reference-accessdate">. Retrieved <span class="nowrap">6 December</span> 2024</span>. <q>TEX has a macro programming language, which allows features to be added.</q></cite></span>
</li>
<li id="cite_note-7"><span class="mw-cite-backlink"><b><a href="#cite_ref-7">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://www.metalevel.at/prolog/macros">"Prolog Macros"</a>. <i>www.metalevel.at</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2021-04-05</span></span>.</cite></span>
</li>
<li id="cite_note-8"><span class="mw-cite-backlink"><b><a href="#cite_ref-8">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://erlang.org/doc/reference_manual/macros.html#defining-and-using-macros">"Erlang -- Preprocessor"</a>. <i>erlang.org</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2021-05-24</span></span>.</cite></span>
</li>
<li id="cite_note-9"><span class="mw-cite-backlink"><b><a href="#cite_ref-9">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://opendylan.org/articles/macro-system/index.html">"The Dylan Macro System — Open Dylan"</a>. <i>opendylan.org</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2021-04-05</span></span>.</cite></span>
</li>
<li id="cite_note-10"><span class="mw-cite-backlink"><b><a href="#cite_ref-10">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://docs.scala-lang.org/overviews/macros/overview.html">"Def Macros"</a>. <i>Scala Documentation</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2021-04-05</span></span>.</cite></span>
</li>
<li id="cite_note-11"><span class="mw-cite-backlink"><b><a href="#cite_ref-11">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://nemerle.org/About">"About - Nemerle programming language official site"</a>. <i>nemerle.org</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2021-04-05</span></span>.</cite></span>
</li>
<li id="cite_note-12"><span class="mw-cite-backlink"><b><a href="#cite_ref-12">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://doc.rust-lang.org/book/ch19-06-macros.html">"Macros - The Rust Programming Language"</a>. <i>doc.rust-lang.org</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2021-04-05</span></span>.</cite></span>
</li>
<li id="cite_note-13"><span class="mw-cite-backlink"><b><a href="#cite_ref-13">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://elixir-lang.org/getting-started/meta/macros.html">"Macros"</a>. <i>elixir-lang.github.com</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2021-04-05</span></span>.</cite></span>
</li>
<li id="cite_note-14"><span class="mw-cite-backlink"><b><a href="#cite_ref-14">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://nim-lang.org/docs/macros.html">"macros"</a>. <i>nim-lang.org</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2021-04-05</span></span>.</cite></span>
</li>
<li id="cite_note-15"><span class="mw-cite-backlink"><b><a href="#cite_ref-15">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://haxe.org/manual/macro.html">"Macros"</a>. <i>Haxe - The Cross-platform Toolkit</i>.</cite></span>
</li>
<li id="cite_note-16"><span class="mw-cite-backlink"><b><a href="#cite_ref-16">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://docs.julialang.org/en/v1/manual/metaprogramming/#man-macros">"Metaprogramming · The Julia Language"</a>. <i>docs.julialang.org</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2021-04-05</span></span>.</cite></span>
</li>
<li id="cite_note-17"><span class="mw-cite-backlink"><b><a href="#cite_ref-17">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://www.sweetjs.org/">"Sweet.js - Hygienic Macros for JavaScript"</a>. <i>www.sweetjs.org</i>.</cite></span>
</li>
<li id="cite_note-18"><span class="mw-cite-backlink"><b><a href="#cite_ref-18">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://ecsharp.net/lemp/">"LeMP Home Page · Enhanced C#"</a>. <i>ecsharp.net</i>.</cite></span>
</li>
<li id="cite_note-19"><span class="mw-cite-backlink"><b><a href="#cite_ref-19">^</a></b></span> <span class="reference-text"><cite id="CITEREFMarshall" class="citation web cs1">Marshall, Joe. <a rel="nofollow" class="external text" href="http://www.brinckerhoff.org/scraps/joe-marshall-on-FEXPRS-and-DEFMACRO.txt">"untitled email"</a><span class="reference-accessdate">. Retrieved <span class="nowrap">May 3,</span> 2012</span>.</cite></span>
</li>
<li id="cite_note-20"><span class="mw-cite-backlink"><b><a href="#cite_ref-20">^</a></b></span> <span class="reference-text"><cite id="CITEREFHart1963" class="citation magazine cs1">Hart, Timothy P. (October 1963). "MACRO Definitions for LISP". <i>AI Memos</i>. <a href="Hdl_(identifier)" class="mw-redirect" title="Hdl (identifier)">hdl</a>:<span class="id-lock-free" title="Freely accessible"><a rel="nofollow" class="external text" href="https://hdl.handle.net/1721.1%2F6111">1721.1/6111</a></span>. AIM-057.</cite></span>
</li>
<li id="cite_note-21"><span class="mw-cite-backlink"><b><a href="#cite_ref-21">^</a></b></span> <span class="reference-text"><cite id="CITEREFKohlbeckerFriedmanFelleisenDuba1986" class="citation conference cs1">Kohlbecker, Eugene; Friedman, Daniel; Felleisen, Matthias; Duba, Bruce (1986). "Hygienic Macro Expansion". <i>LFP '86: Proceedings of the 1986 ACM conference on LISP and functional programming</i>. pp.&nbsp;<span class="nowrap">151–</span>161. <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1145%2F319838.319859">10.1145/319838.319859</a>. <a href="ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a>&nbsp;<bdi>0897912004</bdi>.</cite></span>
</li>
<li id="cite_note-22"><span class="mw-cite-backlink"><b><a href="#cite_ref-22">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external autonumber" href="http://portal.acm.org/citation.cfm?id=99583.99607">[1]</a> Clinger, Rees. "Macros that Work"</span>
</li>
<li id="cite_note-23"><span class="mw-cite-backlink"><b><a href="#cite_ref-23">^</a></b></span> <span class="reference-text"><cite id="CITEREFFlatt" class="citation news cs1">Flatt, Matthew. <a rel="nofollow" class="external text" href="http://www.cs.utah.edu/plt/publications/macromod.pdf">"Composable and compilable macros: you want it when?"</a> <span class="cs1-format">(PDF)</span>.</cite></span>
</li>
<li id="cite_note-24"><span class="mw-cite-backlink"><b><a href="#cite_ref-24">^</a></b></span> <span class="reference-text"><cite id="CITEREFRafkindFlatt" class="citation news cs1">Rafkind, Jon; Flatt, Matthew. <a rel="nofollow" class="external text" href="http://www.cs.utah.edu/plt/publications/gpce12-rf.pdf">"Honu: Syntactic Extension for Algebraic Notation through Enforestation"</a> <span class="cs1-format">(PDF)</span>.</cite></span>
</li>
<li id="cite_note-25"><span class="mw-cite-backlink"><b><a href="#cite_ref-25">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://cs.brown.edu/~sk/Publications/Papers/Published/sk-automata-macros/">"Automata via Macros"</a>. <i>cs.brown.edu</i>.</cite></span>
</li>
<li id="cite_note-three-uses-26"><span class="mw-cite-backlink"><b><a href="#cite_ref-three-uses_26-0">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external autonumber" href="http://people.csail.mit.edu/gregs/ll1-discuss-archive-html/msg01539.html">[2]</a>, Matthias Felleisen, LL1 mailing list posting</span>
</li>
<li id="cite_note-27"><span class="mw-cite-backlink"><b><a href="#cite_ref-27">^</a></b></span> <span class="reference-text"><cite id="CITEREFOrgassWaite1969" class="citation journal cs1">Orgass, Richard J.; Waite, William M. (September 1969). <a rel="nofollow" class="external text" href="https://doi.org/10.1145%2F363219.363226">"A base for a mobile programming system"</a>. <i>Communications of the ACM</i>. <b>12</b> (9). New York, NY, USA: ACM: <span class="nowrap">507–</span>510. <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<span class="id-lock-free" title="Freely accessible"><a rel="nofollow" class="external text" href="https://doi.org/10.1145%2F363219.363226">10.1145/363219.363226</a></span>. <a href="S2CID_(identifier)" class="mw-redirect" title="S2CID (identifier)">S2CID</a>&nbsp;<a rel="nofollow" class="external text" href="https://api.semanticscholar.org/CorpusID:8164996">8164996</a>.</cite></span>
</li>
<li id="cite_note-28"><span class="mw-cite-backlink"><b><a href="#cite_ref-28">^</a></b></span> <span class="reference-text"><cite id="CITEREFWaite1970" class="citation journal cs1">Waite, William M. (July 1970). "The mobile programming system: STAGE2". <i>Communications of the ACM</i>. <b>13</b> (7). New York, NY, USA: ACM: <span class="nowrap">415–</span>421. <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1145%2F362686.362691">10.1145/362686.362691</a>. <a href="S2CID_(identifier)" class="mw-redirect" title="S2CID (identifier)">S2CID</a>&nbsp;<a rel="nofollow" class="external text" href="https://api.semanticscholar.org/CorpusID:11733598">11733598</a>.</cite></span>
</li>
<li id="cite_note-29"><span class="mw-cite-backlink"><b><a href="#cite_ref-29">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20170829171358/http://www.unf.edu/~cwinton/html/cop3601/s10/class.notes/asm6-Macros.pdf">"University of North Florida"</a> <span class="cs1-format">(PDF)</span>. Archived from <a rel="nofollow" class="external text" href="https://www.unf.edu/~cwinton/html/cop3601/s10/class.notes/asm6-Macros.pdf">the original</a> <span class="cs1-format">(PDF)</span> on 2017-08-29<span class="reference-accessdate">. Retrieved <span class="nowrap">2018-08-15</span></span>.</cite></span>
</li>
<li id="cite_note-30"><span class="mw-cite-backlink"><b><a href="#cite_ref-30">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://www.ibm.com/support/knowledgecenter?origURL=api/redirect/zvm/v5r4/index.jsp">"DTF (DOS/VSE)"</a>. <i><a href="IBM" title="IBM">IBM</a></i>.</cite></span>
</li>
<li id="cite_note-31"><span class="mw-cite-backlink"><b><a href="#cite_ref-31">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://www.ibm.com/support/knowledgecenter/SSLTBW_2.1.0/com.ibm.zos.v2r1.asma400/asmr102115.htm">"IBM Knowledge Center"</a>. <i>IBM Knowledge Center</i>. 16 August 2013.</cite></span>
</li>
<li id="cite_note-cisco-32"><span class="mw-cite-backlink">^ <a href="#cite_ref-cisco_32-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-cisco_32-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://www.cisco.com/c/en/us/td/docs/ios/sw_upgrades/interlink/r2_0/api_ref/ammac.html#wp1686">"Assembler Language Macro Instructions"</a>. <i>Cisco</i>.</cite></span>
</li>
<li id="cite_note-33"><span class="mw-cite-backlink"><b><a href="#cite_ref-33">^</a></b></span> <span class="reference-text"><cite class="citation book cs1"><a rel="nofollow" class="external text" href="https://ibiblio.org/apollo/Documents/FortranAssemblyProgramForTheIBM7090.pdf"><i>FORTRAN ASSEMBLY PROGRAM (FAP) for the IBM 709/7090</i></a> <span class="cs1-format">(PDF)</span>. 709/7090 Data Processing System Bulletin. <a href="IBM" title="IBM">IBM</a>. 1961. J28-6098-1.</cite></span>
</li>
<li id="cite_note-34"><span class="mw-cite-backlink"><b><a href="#cite_ref-34">^</a></b></span> <span class="reference-text"><cite class="citation book cs1"><a rel="nofollow" class="external text" href="http://bitsavers.org/pdf/ibm/7090/C28-6311-4_MAP_Oct64.pdf"><i>IBM 7090/7094 Programming Systems: - Macro Assembly Program (MAP) Language</i></a> <span class="cs1-format">(PDF)</span>. Systems Reference Library. 1964. C28-6311-4<span class="reference-accessdate">. Retrieved <span class="nowrap">January 12,</span> 2025</span>.</cite></span>
</li>
<li id="cite_note-35"><span class="mw-cite-backlink"><b><a href="#cite_ref-35">^</a></b></span> <span class="reference-text"><cite class="citation book cs1"><a rel="nofollow" class="external text" href="http://bitsavers.org/pdf/ibm/7070/C28-6121-0_7070autocoder_61.pdf"><i>Reference Manual - IBM 7070 Series Programming Systems - Autocoder</i></a> <span class="cs1-format">(PDF)</span>. IBM Systems Reference Library (First&nbsp;ed.). <a href="IBM_Corporation" class="mw-redirect" title="IBM Corporation">IBM Corporation </a>. 1961. C28-6121-0.</cite></span>
</li>
<li id="cite_note-CSTR99-36"><span class="mw-cite-backlink">^ <a href="#cite_ref-CSTR99_36-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-CSTR99_36-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite id="CITEREFHolbrookBrown" class="citation web cs1">Holbrook, Bernard D.; Brown, W. Stanley. <a rel="nofollow" class="external text" href="https://archive.today/20140902215751/http://cm.bell-labs.com/cm/cs/cstr/99.html">"Computing Science Technical Report No. 99 – A History of Computing Research at Bell Laboratories (1937–1975)"</a>. <a href="Bell_Labs" title="Bell Labs">Bell Labs</a>. Archived from <a rel="nofollow" class="external text" href="http://cm.bell-labs.com/cm/cs/cstr/99.html">the original</a> on September 2, 2014<span class="reference-accessdate">. Retrieved <span class="nowrap">February 2,</span> 2020</span>.</cite></span>
</li>
<li id="cite_note-MSAP-37"><span class="mw-cite-backlink"><b><a href="#cite_ref-MSAP_37-0">^</a></b></span> <span class="reference-text"><cite class="citation encyclopaedia cs1"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20080813125120/http://hopl.murdoch.edu.au/showlanguage.prx?exp=91">"Macro SAP – Macro compiler modification of SAP"</a>. <i>HOPL: Online Historical Encyclopaedia of Programming Languages</i>. Archived from <a rel="nofollow" class="external text" href="http://hopl.murdoch.edu.au/showlanguage.prx?exp=91">the original</a> on August 13, 2008.</cite></span>
</li>
<li id="cite_note-Lay85-38"><span class="mw-cite-backlink"><b><a href="#cite_ref-Lay85_38-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFLayzell1985" class="citation journal cs1"><a href="Paul_Layzell" title="Paul Layzell">Layzell, P.</a> (1985). <a rel="nofollow" class="external text" href="https://doi.org/10.1093%2Fcomjnl%2F28.1.29">"The History of Macro Processors in Programming Language Extensibility"</a>. <i>The Computer Journal</i>. <b>28</b> (1): <span class="nowrap">29–</span>33. <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<span class="id-lock-free" title="Freely accessible"><a rel="nofollow" class="external text" href="https://doi.org/10.1093%2Fcomjnl%2F28.1.29">10.1093/comjnl/28.1.29</a></span>.</cite></span>
</li>
<li id="cite_note-39"><span class="mw-cite-backlink"><b><a href="#cite_ref-39">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://pkg.go.dev/syscall">"syscall package - syscall - Go Packages"</a>. <i>pkg.go.dev</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2024-06-06</span></span>.</cite></span>
</li>
</ol></div></div>
<div class="mw-heading mw-heading2"><h2 id="External_links">External links</h2></div>
<ul><li><a rel="nofollow" class="external text" href="http://www.ibm.com/support/knowledgecenter/SSLTBW_2.1.0/com.ibm.zos.v2r1.asma400/macifmt.htm">How to write Macro Instructions</a></li>
<li><a rel="nofollow" class="external text" href="http://meseec.ce.rit.edu/eecc250-winter99/250-2-2-2000.pdf">Rochester Institute of Technology, Professors Powerpoint</a> <a rel="nofollow" class="external text" href="https://web.archive.org/web/20220615201031/http://meseec.ce.rit.edu/eecc250-winter99/250-2-2-2000.pdf">Archived</a> 2022-06-15 at the <a href="Wayback_Machine" title="Wayback Machine">Wayback Machine</a></li></ul>
<div class="navbox-styles"><style data-mw-deduplicate="TemplateStyles:r1129693374">
/* start https://en.wikipedia.org/ */


.mw-parser-output .hlist dl,.mw-parser-output .hlist ol,.mw-parser-output .hlist ul{margin:0;padding:0}.mw-parser-output .hlist dd,.mw-parser-output .hlist dt,.mw-parser-output .hlist li{margin:0;display:inline}.mw-parser-output .hlist.inline,.mw-parser-output .hlist.inline dl,.mw-parser-output .hlist.inline ol,.mw-parser-output .hlist.inline ul,.mw-parser-output .hlist dl dl,.mw-parser-output .hlist dl ol,.mw-parser-output .hlist dl ul,.mw-parser-output .hlist ol dl,.mw-parser-output .hlist ol ol,.mw-parser-output .hlist ol ul,.mw-parser-output .hlist ul dl,.mw-parser-output .hlist ul ol,.mw-parser-output .hlist ul ul{display:inline}.mw-parser-output .hlist .mw-empty-li{display:none}.mw-parser-output .hlist dt::after{content:": "}.mw-parser-output .hlist dd::after,.mw-parser-output .hlist li::after{content:" · ";font-weight:bold}.mw-parser-output .hlist dd:last-child::after,.mw-parser-output .hlist dt:last-child::after,.mw-parser-output .hlist li:last-child::after{content:none}.mw-parser-output .hlist dd dd:first-child::before,.mw-parser-output .hlist dd dt:first-child::before,.mw-parser-output .hlist dd li:first-child::before,.mw-parser-output .hlist dt dd:first-child::before,.mw-parser-output .hlist dt dt:first-child::before,.mw-parser-output .hlist dt li:first-child::before,.mw-parser-output .hlist li dd:first-child::before,.mw-parser-output .hlist li dt:first-child::before,.mw-parser-output .hlist li li:first-child::before{content:" (";font-weight:normal}.mw-parser-output .hlist dd dd:last-child::after,.mw-parser-output .hlist dd dt:last-child::after,.mw-parser-output .hlist dd li:last-child::after,.mw-parser-output .hlist dt dd:last-child::after,.mw-parser-output .hlist dt dt:last-child::after,.mw-parser-output .hlist dt li:last-child::after,.mw-parser-output .hlist li dd:last-child::after,.mw-parser-output .hlist li dt:last-child::after,.mw-parser-output .hlist li li:last-child::after{content:")";font-weight:normal}.mw-parser-output .hlist ol{counter-reset:listitem}.mw-parser-output .hlist ol>li{counter-increment:listitem}.mw-parser-output .hlist ol>li::before{content:" "counter(listitem)"\a0 "}.mw-parser-output .hlist dd ol>li:first-child::before,.mw-parser-output .hlist dt ol>li:first-child::before,.mw-parser-output .hlist li ol>li:first-child::before{content:" ("counter(listitem)"\a0 "}


/* end https://en.wikipedia.org/ */
</style><style data-mw-deduplicate="TemplateStyles:r1236075235">
/* start https://en.wikipedia.org/ */


.mw-parser-output .navbox{box-sizing:border-box;border:1px solid #a2a9b1;width:100%;clear:both;font-size:88%;text-align:center;padding:1px;margin:1em auto 0}.mw-parser-output .navbox .navbox{margin-top:0}.mw-parser-output .navbox+.navbox,.mw-parser-output .navbox+.navbox-styles+.navbox{margin-top:-1px}.mw-parser-output .navbox-inner,.mw-parser-output .navbox-subgroup{width:100%}.mw-parser-output .navbox-group,.mw-parser-output .navbox-title,.mw-parser-output .navbox-abovebelow{padding:0.25em 1em;line-height:1.5em;text-align:center}.mw-parser-output .navbox-group{white-space:nowrap;text-align:right}.mw-parser-output .navbox,.mw-parser-output .navbox-subgroup{background-color:#fdfdfd}.mw-parser-output .navbox-list{line-height:1.5em;border-color:#fdfdfd}.mw-parser-output .navbox-list-with-group{text-align:left;border-left-width:2px;border-left-style:solid}.mw-parser-output tr+tr>.navbox-abovebelow,.mw-parser-output tr+tr>.navbox-group,.mw-parser-output tr+tr>.navbox-image,.mw-parser-output tr+tr>.navbox-list{border-top:2px solid #fdfdfd}.mw-parser-output .navbox-title{background-color:#ccf}.mw-parser-output .navbox-abovebelow,.mw-parser-output .navbox-group,.mw-parser-output .navbox-subgroup .navbox-title{background-color:#ddf}.mw-parser-output .navbox-subgroup .navbox-group,.mw-parser-output .navbox-subgroup .navbox-abovebelow{background-color:#e6e6ff}.mw-parser-output .navbox-even{background-color:#f7f7f7}.mw-parser-output .navbox-odd{background-color:transparent}.mw-parser-output .navbox .hlist td dl,.mw-parser-output .navbox .hlist td ol,.mw-parser-output .navbox .hlist td ul,.mw-parser-output .navbox td.hlist dl,.mw-parser-output .navbox td.hlist ol,.mw-parser-output .navbox td.hlist ul{padding:0.125em 0}.mw-parser-output .navbox .navbar{display:block;font-size:100%}.mw-parser-output .navbox-title .navbar{float:left;text-align:left;margin-right:0.5em}body.skin--responsive .mw-parser-output .navbox-image img{max-width:none!important}@media print{body.ns-0 .mw-parser-output .navbox{display:none!important}}


/* end https://en.wikipedia.org/ */
</style></div><div role="navigation" class="navbox" aria-labelledby="Programming_paradigms_(Comparison_by_language)368" style="padding:3px"><table class="nowraplinks mw-collapsible autocollapse navbox-inner" style="border-spacing:0;background:transparent;color:inherit"><tbody><tr><th scope="col" class="navbox-title" colspan="2"><style data-mw-deduplicate="TemplateStyles:r1239400231">
/* start https://en.wikipedia.org/ */


.mw-parser-output .navbar{display:inline;font-size:88%;font-weight:normal}.mw-parser-output .navbar-collapse{float:left;text-align:left}.mw-parser-output .navbar-boxtext{word-spacing:0}.mw-parser-output .navbar ul{display:inline-block;white-space:nowrap;line-height:inherit}.mw-parser-output .navbar-brackets::before{margin-right:-0.125em;content:"[ "}.mw-parser-output .navbar-brackets::after{margin-left:-0.125em;content:" ]"}.mw-parser-output .navbar li{word-spacing:-0.125em}.mw-parser-output .navbar a>span,.mw-parser-output .navbar a>abbr{text-decoration:inherit}.mw-parser-output .navbar-mini abbr{font-variant:small-caps;border-bottom:none;text-decoration:none;cursor:inherit}.mw-parser-output .navbar-ct-full{font-size:114%;margin:0 7em}.mw-parser-output .navbar-ct-mini{font-size:114%;margin:0 4em}html.skin-theme-clientpref-night .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}@media(prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}}@media print{.mw-parser-output .navbar{display:none!important}}


/* end https://en.wikipedia.org/ */
</style><div id="Programming_paradigms_(Comparison_by_language)368" style="font-size:114%;margin:0 4em"><a href="Programming_paradigm" title="Programming paradigm">Programming paradigms</a> (<a href="Comparison_of_multi-paradigm_programming_languages" title="Comparison of multi-paradigm programming languages">Comparison by language</a>)</div></th></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Imperative_programming" title="Imperative programming">Imperative</a></th><td class="navbox-list-with-group navbox-list navbox-odd hlist" style="width:100%;padding:0"><div style="padding:0 0.25em"></div><table class="nowraplinks navbox-subgroup" style="border-spacing:0"><tbody><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Structured_programming" title="Structured programming">Structured</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Jackson_structured_programming" title="Jackson structured programming">Jackson structures</a></li>
<li><a href="Block_(programming)" title="Block (programming)">Block-structured</a></li>
<li><a href="Modular_programming" title="Modular programming">Modular</a></li>
<li><a href="Non-structured_programming" title="Non-structured programming">Non-structured</a></li>
<li><a href="Procedural_programming" title="Procedural programming">Procedural</a></li>
<li><a href="Programming_in_the_large_and_programming_in_the_small" title="Programming in the large and programming in the small">Programming in the large and in the small</a></li>
<li><a href="Design_by_contract" title="Design by contract">Design by contract</a></li>
<li><a href="Invariant-based_programming" title="Invariant-based programming">Invariant-based</a></li>
<li><a href="Nested_function" title="Nested function">Nested function</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Object-oriented_programming" title="Object-oriented programming">Object-oriented</a><br>(<a href="Comparison_of_programming_languages_(object-oriented_programming)" title="Comparison of programming languages (object-oriented programming)">comparison</a>, <a href="List_of_object-oriented_programming_languages" title="List of object-oriented programming languages">list</a>)</th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Class-based_programming" title="Class-based programming">Class-based</a>, <a href="Prototype-based_programming" title="Prototype-based programming">Prototype-based</a>, <a href="Object-based_language" title="Object-based language">Object-based</a></li>
<li><a href="Agent-oriented_programming" title="Agent-oriented programming">Agent</a></li>
<li><a href="Immutable_object" title="Immutable object">Immutable object</a></li>
<li><a href="Persistent_programming_language" title="Persistent programming language">Persistent</a></li>
<li><a href="Uniform_function_call_syntax" title="Uniform function call syntax">Uniform function call syntax</a></li></ul>
</div></td></tr></tbody></table><div></div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Declarative_programming" title="Declarative programming">Declarative</a></th><td class="navbox-list-with-group navbox-list navbox-odd hlist" style="width:100%;padding:0"><div style="padding:0 0.25em"></div><table class="nowraplinks navbox-subgroup" style="border-spacing:0"><tbody><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Functional_programming" title="Functional programming">Functional</a><br>(<a href="Comparison_of_functional_programming_languages" title="Comparison of functional programming languages">comparison</a>)</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Recursion_(computer_science)" title="Recursion (computer science)">Recursive</a></li>
<li><a href="Anonymous_function" title="Anonymous function">Anonymous function</a> (<a href="Partial_application" title="Partial application">Partial application</a>)</li>
<li><a href="Higher-order_programming" title="Higher-order programming">Higher-order</a></li>
<li><a href="Purely_functional_programming" title="Purely functional programming">Purely functional</a></li>
<li><a href="Total_functional_programming" title="Total functional programming">Total</a></li>
<li><a href="Strict_programming_language" title="Strict programming language">Strict</a></li>
<li><a href="Generalized_algebraic_data_type" title="Generalized algebraic data type">GADTs</a></li>
<li><a href="Dependent_type" title="Dependent type">Dependent types</a></li>
<li><a href="Functional_logic_programming" title="Functional logic programming">Functional logic</a></li>
<li><a href="Tacit_programming" title="Tacit programming">Point-free style</a></li>
<li><a href="Expression-oriented_programming_language" title="Expression-oriented programming language">Expression-oriented</a></li>
<li><a href="Applicative_programming_language" title="Applicative programming language">Applicative</a>, <a href="Concatenative_programming_language" title="Concatenative programming language">Concatenative</a></li>
<li><a href="Function-level_programming" title="Function-level programming">Function-level</a>, <a href="Value-level_programming" title="Value-level programming">Value-level</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Dataflow_programming" title="Dataflow programming">Dataflow</a></th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Flow-based_programming" title="Flow-based programming">Flow-based</a></li>
<li><a href="Reactive_programming" title="Reactive programming">Reactive</a> (<a href="Functional_reactive_programming" title="Functional reactive programming">Functional reactive</a>)</li>
<li><a href="Signal_programming" class="mw-redirect" title="Signal programming">Signals</a></li>
<li><a href="Stream_processing" title="Stream processing">Streams</a></li>
<li><a href="Synchronous_programming_language" title="Synchronous programming language">Synchronous</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Logic_programming" title="Logic programming">Logic</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Abductive_logic_programming" title="Abductive logic programming">Abductive logic</a></li>
<li><a href="Answer_set_programming" title="Answer set programming">Answer set</a></li>
<li><a href="Constraint_programming" title="Constraint programming">Constraint</a> (<a href="Constraint_logic_programming" title="Constraint logic programming">Constraint logic</a>)</li>
<li><a href="Inductive_logic_programming" title="Inductive logic programming">Inductive logic</a></li>
<li><a href="Nondeterministic_programming" title="Nondeterministic programming">Nondeterministic</a></li>
<li><a href="Ontology_language" title="Ontology language">Ontology</a></li>
<li><a href="Probabilistic_logic_programming" title="Probabilistic logic programming">Probabilistic logic</a></li>
<li><a href="Query_language" title="Query language">Query</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Domain-specific_language" title="Domain-specific language">DSL</a></th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Algebraic_modeling_language" title="Algebraic modeling language">Algebraic modeling</a></li>
<li><a href="Array_programming" title="Array programming">Array</a></li>
<li><a href="Automata-based_programming" title="Automata-based programming">Automata-based</a> (<a href="Action_language" title="Action language">Action</a>)</li>
<li><a href="Command_language" title="Command language">Command</a> (<a href="Spacecraft_command_language" title="Spacecraft command language">Spacecraft</a>)</li>
<li><a href="Differentiable_programming" title="Differentiable programming">Differentiable</a></li>
<li><a href="End-user_development" title="End-user development">End-user</a></li>
<li><a href="Grammar-oriented_programming" title="Grammar-oriented programming">Grammar-oriented</a></li>
<li><a href="Interface_description_language" title="Interface description language">Interface description</a></li>
<li><a href="Language-oriented_programming" title="Language-oriented programming">Language-oriented</a></li>
<li><a href="List_comprehension" title="List comprehension">List comprehension</a></li>
<li><a href="Low-code_development_platform" title="Low-code development platform">Low-code</a></li>
<li><a href="Modeling_language" title="Modeling language">Modeling</a></li>
<li><a href="Natural-language_programming" class="mw-redirect" title="Natural-language programming">Natural language</a></li>
<li><a href="Non-English-based_programming_languages" title="Non-English-based programming languages">Non-English-based</a></li>
<li><a href="Page_description_language" title="Page description language">Page description</a></li>
<li><a href="Pipeline_(software)" title="Pipeline (software)">Pipes</a> and <a href="Filter_(software)" title="Filter (software)">filters</a></li>
<li><a href="Probabilistic_programming" title="Probabilistic programming">Probabilistic</a></li>
<li><a href="Quantum_programming" title="Quantum programming">Quantum</a></li>
<li><a href="Scientific_programming_language" title="Scientific programming language">Scientific</a></li>
<li><a href="Scripting_language" title="Scripting language">Scripting</a></li>
<li><a href="Set_theoretic_programming" title="Set theoretic programming">Set-theoretic</a></li>
<li><a href="Simulation_language" title="Simulation language">Simulation</a></li>
<li><a href="Stack-oriented_programming" title="Stack-oriented programming">Stack-based</a></li>
<li><a href="System_programming_language" title="System programming language">System</a></li>
<li><a href="Tactile_programming_language" title="Tactile programming language">Tactile</a></li>
<li><a href="Template_processor" title="Template processor">Templating</a></li>
<li><a href="Transformation_language" title="Transformation language">Transformation</a> (<a href="Graph_rewriting" title="Graph rewriting">Graph rewriting</a>, <a href="Production_system_(computer_science)" title="Production system (computer science)">Production</a>, <a href="Pattern_matching" title="Pattern matching">Pattern</a>)</li>
<li><a href="Visual_programming_language" title="Visual programming language">Visual</a></li></ul>
</div></td></tr></tbody></table><div></div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Concurrent_computing" title="Concurrent computing">Concurrent</a>,<br><a href="Distributed_computing" title="Distributed computing">distributed</a>,<br><a href="Parallel_computing" title="Parallel computing">parallel</a></th><td class="navbox-list-with-group navbox-list navbox-odd hlist" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Actor_model" title="Actor model">Actor-based</a></li>
<li><a href="Automatic_mutual_exclusion" title="Automatic mutual exclusion">Automatic mutual exclusion</a></li>
<li><a href="Choreographic_programming" title="Choreographic programming">Choreographic programming</a></li>
<li><a href="Concurrent_logic_programming" title="Concurrent logic programming">Concurrent logic</a> (<a href="Concurrent_constraint_logic_programming" title="Concurrent constraint logic programming">Concurrent constraint logic</a>)</li>
<li><a href="Concurrent_object-oriented_programming" title="Concurrent object-oriented programming">Concurrent OO</a></li>
<li><a href="Macroprogramming" title="Macroprogramming">Macroprogramming</a></li>
<li><a href="Multitier_programming" title="Multitier programming">Multitier programming</a></li>
<li><a href="Organic_computing" title="Organic computing">Organic computing</a></li>
<li><a href="Parallel_programming_model" title="Parallel programming model">Parallel programming models</a></li>
<li><a href="Partitioned_global_address_space" title="Partitioned global address space">Partitioned global address space</a></li>
<li><a href="Process-oriented_programming" title="Process-oriented programming">Process-oriented</a></li>
<li><a href="Relativistic_programming" title="Relativistic programming">Relativistic programming</a></li>
<li><a href="Service-oriented_programming" title="Service-oriented programming">Service-oriented</a></li>
<li><a href="Structured_concurrency" title="Structured concurrency">Structured concurrency</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Metaprogramming" title="Metaprogramming">Metaprogramming</a></th><td class="navbox-list-with-group navbox-list navbox-even hlist" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Attribute-oriented_programming" title="Attribute-oriented programming">Attribute-oriented</a></li>
<li><a href="Automatic_programming" title="Automatic programming">Automatic</a> (<a href="Inductive_programming" title="Inductive programming">Inductive</a>)</li>
<li><a href="Dynamic_programming_language" title="Dynamic programming language">Dynamic</a></li>
<li><a href="Extensible_programming" title="Extensible programming">Extensible</a></li>
<li><a href="Generic_programming" title="Generic programming">Generic</a></li>
<li><a href="Homoiconicity" title="Homoiconicity">Homoiconicity</a></li>
<li><a href="Interactive_programming" title="Interactive programming">Interactive</a></li>
<li> (<a href="Hygienic_macro" title="Hygienic macro">Hygienic</a>)</li>
<li><a href="Metalinguistic_abstraction" title="Metalinguistic abstraction">Metalinguistic abstraction</a></li>
<li><a href="Multi-stage_programming" title="Multi-stage programming">Multi-stage</a></li>
<li><a href="Program_synthesis" title="Program synthesis">Program synthesis</a> (<a href="Bayesian_program_synthesis" title="Bayesian program synthesis">Bayesian</a>, <a href="Inferential_programming" title="Inferential programming">Inferential</a>, <a href="Programming_by_demonstration" title="Programming by demonstration">by demonstration</a>, <a href="Programming_by_example" title="Programming by example">by example</a>)</li>
<li><a href="Reflective_programming" title="Reflective programming">Reflective</a></li>
<li><a href="Self-modifying_code" title="Self-modifying code">Self-modifying code</a></li>
<li><a href="Symbolic_programming" title="Symbolic programming">Symbolic</a></li>
<li><a href="Template_metaprogramming" title="Template metaprogramming">Template</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Separation_of_concerns" title="Separation of concerns">Separation<br>of concerns</a></th><td class="navbox-list-with-group navbox-list navbox-odd hlist" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Aspect-oriented_programming" title="Aspect-oriented programming">Aspects</a></li>
<li><a href="Component-based_software_engineering" title="Component-based software engineering">Components</a></li>
<li><a href="Data-driven_programming" title="Data-driven programming">Data-driven</a></li>
<li><a href="Data-oriented_design" title="Data-oriented design">Data-oriented</a></li>
<li><a href="Event-driven_programming" title="Event-driven programming">Event-driven</a></li>
<li><a href="Feature-oriented_programming" title="Feature-oriented programming">Features</a></li>
<li><a href="Literate_programming" title="Literate programming">Literate</a></li>
<li><a href="Role-oriented_programming" title="Role-oriented programming">Roles</a></li>
<li><a href="Subject-oriented_programming" title="Subject-oriented programming">Subjects</a></li></ul>
</div></td></tr></tbody></table></div>
<div class="navbox-styles"></div><div role="navigation" class="navbox" aria-labelledby="Types_of_programming_languages107" style="padding:3px"><table class="nowraplinks mw-collapsible autocollapse navbox-inner" style="border-spacing:0;background:transparent;color:inherit"><tbody><tr><th scope="col" class="navbox-title" colspan="2"><div id="Types_of_programming_languages107" style="font-size:114%;margin:0 4em"><a href="Programming_paradigm" title="Programming paradigm">Types of programming languages</a></div></th></tr><tr><th scope="row" class="navbox-group" style="width:1%">Level</th><td class="navbox-list-with-group navbox-list navbox-odd hlist" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Machine_code" title="Machine code">Machine</a></li>
<li><a href="Assembly_language" title="Assembly language">Assembly</a></li>
<li><a href="Compiled_language" title="Compiled language">Compiled</a></li>
<li><a href="Interpreted_language" class="mw-redirect" title="Interpreted language">Interpreted</a></li></ul>
<ul><li><a href="Low-level_programming_language" title="Low-level programming language">Low-level</a></li>
<li><a href="High-level_programming_language" title="High-level programming language">High-level</a></li>
<li><a href="Very_high-level_programming_language" title="Very high-level programming language">Very high-level</a></li>
<li><a href="Esoteric_programming_language" title="Esoteric programming language">Esoteric</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Programming_language_generations" title="Programming language generations">Generation</a></th><td class="navbox-list-with-group navbox-list navbox-even hlist" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="First-generation_programming_language" title="First-generation programming language">First</a></li>
<li><a href="Second-generation_programming_language" title="Second-generation programming language">Second</a></li>
<li><a href="Third-generation_programming_language" title="Third-generation programming language">Third</a></li>
<li><a href="Fourth-generation_programming_language" title="Fourth-generation programming language">Fourth</a></li>
<li><a href="Fifth-generation_programming_language" title="Fifth-generation programming language">Fifth</a></li></ul>
</div></td></tr></tbody></table></div>
<div class="navbox-styles"></div><div role="navigation" class="navbox authority-control" aria-labelledby="Authority_control_databases_frameless&amp;#124;text-top&amp;#124;10px&amp;#124;alt=Edit_this_at_Wikidata&amp;#124;link=https&amp;#58;//www.wikidata.org/wiki/Q629579#identifiers&amp;#124;class=noprint&amp;#124;Edit_this_at_Wikidata719" style="padding:3px"><table class="nowraplinks hlist mw-collapsible autocollapse navbox-inner" style="border-spacing:0;background:transparent;color:inherit"><tbody><tr><th scope="col" class="navbox-title" colspan="2"><div id="Authority_control_databases_frameless&amp;#124;text-top&amp;#124;10px&amp;#124;alt=Edit_this_at_Wikidata&amp;#124;link=https&amp;#58;//www.wikidata.org/wiki/Q629579#identifiers&amp;#124;class=noprint&amp;#124;Edit_this_at_Wikidata719" style="font-size:114%;margin:0 4em">Authority control databases </div></th></tr><tr><th scope="row" class="navbox-group" style="width:1%">National</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"><ul><li><span class="uid"><a rel="nofollow" class="external text" href="https://d-nb.info/gnd/4125810-1">Germany</a></span></li><li><span class="uid"><a rel="nofollow" class="external text" href="https://id.loc.gov/authorities/sh85079429">United States</a></span></li><li><span class="uid"><a rel="nofollow" class="external text" href="https://www.nli.org.il/en/authorities/987007541030005171">Israel</a></span></li></ul></div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Other</th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em"><ul><li><span class="uid"><a rel="nofollow" class="external text" href="https://lux.collections.yale.edu/view/concept/1f24f119-9a17-4098-a351-d8502a14731c">Yale LUX</a></span></li></ul></div></td></tr></tbody></table></div></div><!--htdig_noindex--><div><div class="zim-footer">
This article is issued from <a class="external text" title="Last edited on 2025-07-25" href="https://en.wikipedia.org/wiki/?title=Macro_(computer_science)&amp;oldid=1302433247">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>

</body></html>